
//todo
// 假设有k个人质和k个绑匪围成一圈。人质的编号从1到k，绑匪的编号从k+1到2k。
// 从编号1开始，每次从其中选出第m个人(隔m-1选出一人)出列。
// 希望求出m的最小值，使得最先出列的k个人都是绑匪，即都是编号从k+1到2k的人。
#include "iostream"
#include "vector"
#include "unordered_map"
#include "algorithm"

int main() {
    int m;//被分割的数

    while (std::cin >> m) {
//        std::vector<int> vec;
        int n=1;//等差数列
        int sum=0;//等差求和
        int left=0;
        while(1){
            if(m-sum>=n){
//                vec.push_back(n);
            }else{
                left=m-sum;
                n--;
                break;
            }
            sum+=n;
            n++;
             }
        bool first= true;

        for(int i=1;i<=n;i++){
            if(!first){
                printf(",");
            }
            first=false;
            int a=i;
            if(n-i<left){
                a++;
            }
            printf("%d",a);
        }
        printf("\n");
    }
//    while(1){}
    return 0;
}